﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Telecom.Data;
using TelecomGis.Helper.Control;
using Telecom.Service;
using TelecomGis.Models;
using TelecomGis.Controllers;
using System.Threading;

namespace VNPT_BSC.Controllers
{
    [Authorize]
    public class PhanQuyenController : ContronllerBase
    {
        private readonly RoleSer _RoleSer = new RoleSer();
        private readonly UserSer _UserSer = new UserSer();
        private readonly rolesMenuSer _rolesMenuSer = new rolesMenuSer();
        private readonly MenuSer _MenuSer = new MenuSer();
        private readonly MainmenuSer _MainmenuSer = new MainmenuSer();
        private readonly QuyenHT_Ser _QuyenHT_Ser = new QuyenHT_Ser();
        private readonly loaiSiteSer _loaiSiteSer = new loaiSiteSer();
        private readonly donviToSer _donviToSer = new donviToSer();
        private readonly UserDonvi_Ser _UserDonvi_Ser = new UserDonvi_Ser();
        private readonly UserQuyenHT_Ser _UserQuyenHT_Ser = new UserQuyenHT_Ser();
        //
        // GET: /PhanQuyen/

        public ActionResult Roles()
        {
            return PartialView("_Roles");
        }

        

        public ActionResult RolesById(int rolesId)
        {
            var _listEntity = _RoleSer.GetById(rolesId);
            var jsonResult = Json(_listEntity, JsonRequestBehavior.AllowGet);
            jsonResult.MaxJsonLength = int.MaxValue;
            return jsonResult;
        }

        public ActionResult RolesList()
        {
            var _listEntity = _RoleSer.List();
            var jsonResult = Json(_listEntity, JsonRequestBehavior.AllowGet);
            jsonResult.MaxJsonLength = int.MaxValue;
            return jsonResult;
        }

        public string RolesListStr()
        {
            var _listEntity = _RoleSer.List();
            return JsonConvert.SerializeObject(_listEntity, Formatting.Indented,
                              new JsonSerializerSettings
                              {
                                  ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                              });

        }

        public ActionResult AddUpdateRoles()
        {
            ROLES _rl = new ROLES();
            return PartialView("_AddUpdateRoles", _rl);
        }

        public ActionResult UpdateRoles(int rolesId)
        {
            ROLES _rl = new ROLES();
            _rl = _RoleSer.GetById(rolesId);
            return PartialView("_AddUpdateRoles", _rl);
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddUpdateRoles(ROLES model)
        {
            try
            {
                if (string.IsNullOrEmpty(model.TEN))
                {
                    return JsonError("Vui lòng nhập tên ROLES");
                }

                _RoleSer.addOrupdate(model);

                return JsonSuccess("");
            }
            catch { return Json(false, JsonRequestBehavior.AllowGet); }
        }

        public ActionResult DestroyRoles(int rolesid)
        {
            try
            {
                _RoleSer.delete(rolesid);
                return Json("SCUESS", JsonRequestBehavior.AllowGet);
            }
            catch { return Json("ERROR", JsonRequestBehavior.AllowGet); }
        }

        public ActionResult RoleMenuList(int rolesId)
        {
            var _listEntity = _rolesMenuSer.getRoleMenuInRoles(rolesId);
            var jsonResult = Json(_listEntity, JsonRequestBehavior.AllowGet);
            jsonResult.MaxJsonLength = int.MaxValue;
            return jsonResult;
        }
        
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddMenuOnRoles(ROLE_MENUS model)
        {
            if (model.ROLEID == 0)
            {
                return JsonError("Vui lòng chọn Roles");
            }

            if (model.MENUID == 0)
            {
                return JsonError("Vui lòng chọn menu");
            }

            bool check = _rolesMenuSer.checkMenuExtisInRoles(model.MENUID.Value, model.ROLEID.Value);
            if (check) return JsonError("Menu này đã được thêm vào roles trước đó, vui lòng xem lại.");
            else
            {

                _rolesMenuSer.addorUpdate(model);

                return JsonSuccess("");
            }

        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult UpdateMenuOnRoles(ROLE_MENUS model)
        {
            if (model.ROLEID == 0)
            {
                return JsonError("Vui lòng chọn Roles");
            }

            if (model.MENUID == 0)
            {
                return JsonError("Vui lòng chọn menu");
            }

            string IdMenuOd = Request["MenuUpdateIdOld"];
            string ROLESMenuOd = Request["RolesUpdateIdOld"];

            if ( (int.Parse(IdMenuOd) != model.MENUID) || (int.Parse(ROLESMenuOd) != model.ROLEID))
            {
                bool check = _rolesMenuSer.checkMenuExtisInRoles(model.MENUID.Value, model.ROLEID.Value);
                if (check) return JsonError("Roles hoặc Menu bạn thay đổi đã được thêm vào trước đó, vui lòng xem lại.");
                else
                {
                    _rolesMenuSer.addorUpdate(model);
                    return JsonSuccess("");

                }
            }
            else
            {
                _rolesMenuSer.addorUpdate(model);
                return JsonSuccess("");
            }
           
        }

        public ActionResult AddMenuOnRoles(int RID)
        {
            var entity = new ROLE_MENUS();
            entity.MENUID = 0;
            entity.ROLEID = RID;
            entity.RMID = 0;
            ViewBag.MMID = 0;

            return PartialView("_AddMenuOnRoles", entity);
        }

        public ActionResult EditMenuOnRoles(int RID)
        {
            var entity = _rolesMenuSer.GetById(RID);
            var entityMenu = _MenuSer.GetById(entity.MENUID.Value);
            ViewBag.MMID = _MainmenuSer.GetById(entityMenu.MAINMENU.Value).MMID;

            return PartialView("_EditMenuOnRoles", entity);
        }

        public ActionResult DestroyRolesOnMenu(string RMID)
        {
            try
            {
                _rolesMenuSer.detele(int.Parse(RMID));

                return Json(true, JsonRequestBehavior.AllowGet);
            }
            catch { return Json(false, JsonRequestBehavior.AllowGet); }
        }

        //Page quản lý thành viên
        public ActionResult Nguoidung()
        {

            return PartialView("_UserManager");

        }

        public ActionResult _USERList(string donviId, string tokt)
        {

            var _listEntity = _UserSer.GetUserListOnDON(donviId, tokt);
            var jsonResult = Json(_listEntity, JsonRequestBehavior.AllowGet);
            jsonResult.MaxJsonLength = int.MaxValue;
            return jsonResult;
        }

        public ActionResult AddUpdateUser(string donviId, string tokt)
        {
            TelecomGis.Models.UserModel.USERVM model = new TelecomGis.Models.UserModel.USERVM();

            model._entityUser.USERID = 0;
            model._entityUser.ACTIVE = 1;

            ViewBag.donviAddUser = string.IsNullOrEmpty(donviId) ? "" : donviId + "-DV";
            ViewBag.ToKyThucatAddUser = string.IsNullOrEmpty(tokt) ? "" : tokt + "-TO";



            var listRoles = _RoleSer.List();

            if (listRoles.Count() > 0)
            {
                foreach (var item in listRoles)
                {
                    TelecomGis.Models.UserModel.RolesOnUser itemCheck = new TelecomGis.Models.UserModel.RolesOnUser()
                    {
                        Id = item.ROLEID,
                        Name = item.TEN,
                        Checkbox = false

                    };
                    model._RolesOnUser.Add(itemCheck);
                }
            }

            var listLoaiSite = _loaiSiteSer.getList();

            if (listLoaiSite.Count() > 0)
            {
                foreach (var item in listLoaiSite)
                {
                    TelecomGis.Models.UserModel.LoaiSiteOnUser itemCheck = new TelecomGis.Models.UserModel.LoaiSiteOnUser()
                    {
                        Id = item.MA,
                        Name = item.TEN,
                        Checkbox = false

                    };
                    model._LoaiSiteOnUser.Add(itemCheck);
                }
            }
            
            var list_quyenHT = _QuyenHT_Ser.getList();
            if (list_quyenHT.Count() > 0)
            {
                foreach (var item in list_quyenHT)
                {
                    TelecomGis.Models.UserModel.QUYENGTOnUser itemCheck = new TelecomGis.Models.UserModel.QUYENGTOnUser()
                    {
                        Id = item.QUYENHTID,
                        Name = item.TEN,
                        Checkbox = false
                    };

                    model._QUYENHTOnUser.Add(itemCheck);
                }

                try
                {
                    model._QUYENHTOnUser = model._QUYENHTOnUser.OrderBy(p => p.Id).ToList();
                }
                catch { }
            }

            return PartialView("_AddUpdateUser", model);
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddNhanVien(TelecomGis.Models.UserModel.USERVM model)
        {


            //var ListPhanQuyen = Request["listArrryToQLiId"];

            if (string.IsNullOrEmpty(model.listArrryToQLiId))
            {
                return JsonError("Vui lòng chọn tổ đơn vị cho User");
            }

            if (string.IsNullOrEmpty(model._entityUser.USERNAME))
            {
                return JsonError("Vui lòng nhập tên đăng nhập");
            }

            var entity_user = _UserSer.GetByUserName(model._entityUser.USERNAME);
            if (entity_user != null)
            {
                return JsonError("Tên đăng nhập " + model._entityUser.USERNAME + " này đã tồn tại");
            }

            if (string.IsNullOrEmpty(model._entityUser.PASSWORD))
            {
                return JsonError("Vui lòng nhập tên mật khẩu");
            }

            var _listcheck_roles = model._RolesOnUser.Where(p => p.Checkbox == true).ToList();

            if (_listcheck_roles == null)
            {
                return JsonError("Vui lòng cập nhật Roles cho User " + model._entityUser.USERNAME);
            }
            else if (_listcheck_roles.Count == 0)
            {
                return JsonError("Vui lòng cập nhật Roles cho User " + model._entityUser.USERNAME);
            }

            var _listcheck_quyen_ht = model._QUYENHTOnUser.Where(p => p.Checkbox == true).ToList();

            if (_listcheck_quyen_ht == null)
            {
                return JsonError("Vui lòng cập nhật quyền hệ thống cho User " + model._entityUser.USERNAME);
            }
            else if (_listcheck_quyen_ht.Count == 0)
            {
                return JsonError("Vui lòng cập nhật quyền hệ thống cho User " + model._entityUser.USERNAME);
            }

            //if (string.IsNullOrEmpty(model.listArrryDonviId))
            //{
            //    return JsonError("Vui lòng cập nhật thông tin đơn vị cho User " + model._entityUser.USERNAME);
            //}


            decimal idUser = _UserSer.addOrupdate(model._entityUser);
            Thread.Sleep(50);
            var UserEnity = _UserSer.GetByUserByEmail(model._entityUser.USERNAME);

            int checkIdRoles = 1;
            foreach (var g in model._RolesOnUser)
            {
                if (g.Checkbox == true)
                {
                    USER_ROLES userInRo = new USER_ROLES();
                    userInRo.URID = checkIdRoles;
                    userInRo.USERID = UserEnity.USERID;
                    userInRo.ROLEID = g.Id;
                    _RoleSer.Create_PhanQuyen(userInRo);
                }

                checkIdRoles++;
            }


            string[] stringArrayDVIDs = model.listArrryToQLiId.Split(',');
            for (int i = 0; i < stringArrayDVIDs.Length; i++)
            {
                string[] stringPart = stringArrayDVIDs[i].Split('-');

                if (stringPart[stringPart.Length - 1] == "DV")
                {
                    USER_DONVI userInRo = new USER_DONVI();
                    userInRo.ID = i;
                    userInRo.USERID = UserEnity.USERID;
                    userInRo.DONVIID = stringArrayDVIDs[i].Replace("-DV", "").ToString();
                    userInRo.TOID = "";
                    _UserDonvi_Ser.addDonViUser(userInRo);
                }
                else
                {
                    USER_DONVI userInRo = new USER_DONVI();
                    userInRo.ID = i;
                    userInRo.USERID = UserEnity.USERID; ;
                    userInRo.TOID = stringArrayDVIDs[i].Replace("-TO", "").ToString();
                    userInRo.DONVIID = _donviToSer.get_To_ById(userInRo.TOID).DONVI;
                    _UserDonvi_Ser.addDonViUser(userInRo);
                }

                
            }

            int IDChecLSAdd = 1;
            foreach (var g in model._LoaiSiteOnUser)
            {
                if (g.Checkbox == true)
                {
                    USER_SITE userInRo = new USER_SITE();
                    userInRo.ID = IDChecLSAdd;
                    userInRo.USERID = UserEnity.USERID;
                    userInRo.LOAISITE = g.Id;
                    _loaiSiteSer.Create_UserSite(userInRo);
                }

                IDChecLSAdd++;
            }

            int IDQyenLSAdd = 1;
            foreach (var g in model._QUYENHTOnUser)
            {
                if (g.Checkbox == true)
                {
                    USER_QUYENHT userInRo = new USER_QUYENHT();
                    userInRo.ID = IDQyenLSAdd;
                    userInRo.USERID = UserEnity.USERID;
                    userInRo.QUYENHTID = g.Id;
                    _UserQuyenHT_Ser.addQuyenUser(userInRo);
                }

                IDQyenLSAdd++;
            }

            return JsonSuccess("");
        }

        public ActionResult _UpdateUser(int UserId)
        {
           TelecomGis.Models.UserModel.USERVM model = new TelecomGis.Models.UserModel.USERVM();

           string ArrrayDonviUser = string.Join(",", _UserSer.ListDonViByUser(UserId)) + "," + string.Join(",", _UserSer.ListToKTByUser(UserId));

           ViewBag.ListUserDonviTo = ArrrayDonviUser;

            model._entityUser = _UserSer.GetByUserById(UserId);

            var listRoles = _RoleSer.List();

            if (listRoles.Count() > 0)
            {
                foreach (var item in listRoles)
                {
                    TelecomGis.Models.UserModel.RolesOnUser itemCheck = new TelecomGis.Models.UserModel.RolesOnUser()
                    {
                        Id = item.ROLEID,
                        Name = item.TEN,
                        Checkbox = _UserSer.checkExitsRolesiD(UserId, item.ROLEID)

                    };
                    model._RolesOnUser.Add(itemCheck);
                }
            }

            var listLoaiSite = _loaiSiteSer.getList();

            if (listLoaiSite.Count() > 0)
            {
                foreach (var item in listLoaiSite)
                {
                    TelecomGis.Models.UserModel.LoaiSiteOnUser itemCheck = new TelecomGis.Models.UserModel.LoaiSiteOnUser()
                    {
                        Id = item.MA,
                        Name = item.TEN,
                        Checkbox = _UserSer.checkExitsLoaiSiteId(UserId, item.MA) 

                    };
                    model._LoaiSiteOnUser.Add(itemCheck);
                }
            }

            var list_quyenHT = _QuyenHT_Ser.getList();
            if (list_quyenHT.Count() > 0)
            {
                foreach (var item in list_quyenHT)
                {
                    TelecomGis.Models.UserModel.QUYENGTOnUser itemCheck = new TelecomGis.Models.UserModel.QUYENGTOnUser()
                    {
                        Id = item.QUYENHTID,
                        Name = item.TEN,
                        Checkbox = _UserSer.checkExitsQuyenHT(UserId, item.QUYENHTID)
                    };

                    model._QUYENHTOnUser.Add(itemCheck);
                }

                try
                {
                    model._QUYENHTOnUser = model._QUYENHTOnUser.OrderBy(p => p.Id).ToList();
                }
                catch { }
            }


            return PartialView("_UpdateUser", model);
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult UpdateNhanVien(TelecomGis.Models.UserModel.USERVM model)
        {


            //var ListPhanQuyen = Request["listArrryToQLiId"];

            if (string.IsNullOrEmpty(model.listArrryToQLiId))
            {
                return JsonError("Vui lòng chọn tổ đơn vị cho User");
            }

            if (string.IsNullOrEmpty(model._entityUser.USERNAME))
            {
                return JsonError("Vui lòng nhập tên đăng nhập");
            }

            var UserNameOld = Request["userNameOld_updateUser"];

            if (UserNameOld.ToUpper() != model._entityUser.USERNAME.ToUpper())
            {
                var entity_user = _UserSer.GetByUserName(model._entityUser.USERNAME);
                if (entity_user != null)
                {
                    return JsonError("Tên đăng nhập " + model._entityUser.USERNAME + " bạn thay đổi này đã tồn tại");
                }
            }

            var PassNameOld = Request["passwordOld_updateUser"];

            var _listcheck_roles = model._RolesOnUser.Where(p => p.Checkbox == true).ToList();

            if (_listcheck_roles == null)
            {
                return JsonError("Vui lòng cập nhật Roles cho User " + model._entityUser.USERNAME);
            }
            else if (_listcheck_roles.Count == 0)
            {
                return JsonError("Vui lòng cập nhật Roles cho User " + model._entityUser.USERNAME);
            }

            var _listcheck_quyen_ht = model._QUYENHTOnUser.Where(p => p.Checkbox == true).ToList();

            if (_listcheck_quyen_ht == null)
            {
                return JsonError("Vui lòng cập nhật quyền hệ thống cho User " + model._entityUser.USERNAME);
            }
            else if (_listcheck_quyen_ht.Count == 0)
            {
                return JsonError("Vui lòng cập nhật quyền hệ thống cho User " + model._entityUser.USERNAME);
            }

            //if (string.IsNullOrEmpty(model.listArrryDonviId))
            //{
            //    return JsonError("Vui lòng cập nhật thông tin đơn vị cho User " + model._entityUser.USERNAME);
            //}


            decimal idUser = _UserSer.addOrupdate(model._entityUser);
            Thread.Sleep(50);
            //var UserEnity = _UserSer.GetByUserByEmail(model._entityUser.USERNAME);

            int checkIdRoles = 1;
            foreach (var g in model._RolesOnUser)
            {
                if (g.Checkbox == true)
                {
                    if (!_UserSer.checkExitsRolesiD(idUser, g.Id))
                    {
                        USER_ROLES userInRo = new USER_ROLES();
                        userInRo.URID = checkIdRoles;
                        userInRo.USERID = idUser;
                        userInRo.ROLEID = g.Id;
                        _RoleSer.Create_PhanQuyen(userInRo);
                    }
                }
                else
                {
                    if (_UserSer.checkExitsRolesiD(idUser, g.Id))
                    {
                        _UserSer.removeRolesInUsser(idUser, g.Id);
                    }
                }

                checkIdRoles++;
            }


            var ArrayTOKT = _UserSer.ListToKTByUserMain(model._entityUser.USERID);

            List<string> listArrayTOKT = new List<string>(ArrayTOKT);

            string[] stringArrayDVIDs = model.listArrryToQLiId.Split(',');
            for (int i = 0; i < stringArrayDVIDs.Length; i++)
            {
                string[] stringPart = stringArrayDVIDs[i].Split('-');

                if (stringPart[stringPart.Length - 1] == "DV")
                {

                    //USER_DONVI userInRo = new USER_DONVI();
                    //userInRo.ID = i;
                    //userInRo.USERID = idUser;
                    //userInRo.DONVIID = stringArrayDVIDs[i].Replace("-DV", "").ToString();
                    //userInRo.TOID = "";
                    //_UserDonvi_Ser.addDonViUser(userInRo);
                }
                else
                {
                    string toId = stringArrayDVIDs[i].Replace("-TO", "").ToString();
                    if(ArrayTOKT.Contains(toId))
                    {
                        listArrayTOKT.Remove(toId);
                    }
                    else
                    {
                        USER_DONVI userInRo = new USER_DONVI();
                        userInRo.ID = i;
                        userInRo.USERID = idUser;
                        userInRo.TOID = toId;
                        userInRo.DONVIID = _donviToSer.get_To_ById(userInRo.TOID).DONVI;
                        _UserDonvi_Ser.addDonViUser(userInRo);
                    }

                    
                }


            }

            if (listArrayTOKT != null)
            {
                foreach (var item in listArrayTOKT)
                {
                    _UserSer.removeUserToKT(model._entityUser.USERID, item);
                }
            }       

            int IDChecLSAdd = 1;
            foreach (var g in model._LoaiSiteOnUser)
            {
                if (g.Checkbox == true)
                {
                    if (!_UserSer.checkExitsLoaiSiteId(idUser, g.Id))
                    {

                        USER_SITE userInRo = new USER_SITE();
                        userInRo.ID = IDChecLSAdd;
                        userInRo.USERID = idUser;
                        userInRo.LOAISITE = g.Id;
                        _loaiSiteSer.Create_UserSite(userInRo);
                    }
                }
                else
                {
                    if (_UserSer.checkExitsLoaiSiteId(idUser, g.Id))
                    {
                        _UserSer.removeLoaiSiteInUsser(idUser, g.Id);
                    }
                }

                IDChecLSAdd++;
            }

            int IDQyenLSAdd = 1;
            foreach (var g in model._QUYENHTOnUser)
            {
                if (g.Checkbox == true)
                {

                    if (!_UserSer.checkExitsQuyenHT(idUser, g.Id))
                    {
                        USER_QUYENHT userInRo = new USER_QUYENHT();
                        userInRo.ID = IDQyenLSAdd;
                        userInRo.USERID = idUser;
                        userInRo.QUYENHTID = g.Id;
                        _UserQuyenHT_Ser.addQuyenUser(userInRo);
                    }
                }
                else
                {
                    if (_UserSer.checkExitsQuyenHT(idUser, g.Id))
                    {
                        _UserSer.removeUserQuyenHTInUsser(idUser, g.Id);
                    }
                }

                IDQyenLSAdd++;
            }

            return JsonSuccess("");
        }

    }
}
